package 设计模式.创建者模式.单例模式.懒汉式_静态内部类;

import java.io.Serializable;

/**
 * @Author: kirito
 * @Date: 2024/3/8 11:17
 * @Description: 静态内部类
 *
 * 外部类加载时并不需要立即加载内部类，内部类不被加载则不去初始化INSTANCE，
 * 故而不占内存。即当SingleTon第一次被加载时，并不需要去加载SingleTonHoler，
 * 只有当getInstance()方法第一次被调用时，才会去初始化INSTANCE,
 * 第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类，
 * 这种方法不仅能确保线程安全，也能保证单例的唯一性，同时也延迟了单例的实例化。
 *
 */

public class Singleton implements Serializable {
    private static boolean flag = false;

    private Singleton() {
        synchronized (Singleton.class) {
            //反射破解单例解决办法
            //说明非第一次访问，直接抛异常
            if (flag) {
                throw new RuntimeException("不能创建多个对象");
            }
            //将flag设置为true
            flag = true;

        }
    }

    //定义一个静态内部类
    private static class SingletonBuilder {
        //在内部类中声明并初始化外部类对象
        private static final Singleton INSTANCE = new Singleton();
    }


    public static Singleton getInstance() {
        return SingletonBuilder.INSTANCE;
    }

    /**
     * 当进行反序列化时，会自动调用该方法，将该方法的返回值直接返回
     * 为什么会自动调用这个方法呢
     * ReadObject方法的时候会判断原对象是否有这个方法👇，有的话就会执行
     */
    public Object readResolve() {
        return SingletonBuilder.INSTANCE;
    }
}
